home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1997 January & February / Amiga-CD 1997 #1-2.iso / aminet / 12_96 / lha-archiv / rcs_56.lha / rcs / rcsfreeze.rexx < prev    next >
OS/2 REXX Batch file  |  1992-03-31  |  5KB  |  179 lines

  1. /*************************************************************
  2.  * Snevl's ARexx implementation of rcsfreeze.sh
  3.  *
  4.  * rcsfreeze - assign a symbolic revision number to a
  5.  * configuration of RCS files
  6.  *
  7.  * $Id$
  8.  *
  9.  * The idea is to run rcsfreeze each time a new version is 
  10.  * checked in. A unique symbolic revision number (C_[number], 
  11.  * where number is increased each time rcsfreeze is run) is 
  12.  * then assigned to the most recent revision of each RCS file
  13.  * of the main trunk.
  14.  *
  15.  * If the command is invoked with an argument, then this
  16.  * argument is used as the symbolic name to freeze a config-
  17.  * uration. The unique identifier is still generated and is 
  18.  * listed in the log file but it will not appear as part of
  19.  * the symbolic revision name in the actual RCS file. A log
  20.  * message is requested from the user which is saved for future
  21.  * references.
  22.  *
  23.  * The shell script works only on all RCS files at one time.
  24.  * It is important that all changed files are checked in (there
  25.  * are no precautions against any error in this respect).
  26.  *
  27.  * file names:
  28.  *    RCS/rcsfreeze.ver    version number
  29.  *    RCS/rscfreeze.log    log messages, most recent first
  30.  ***************************************************************/
  31.  
  32. parse arg SYMREVNAME
  33.  
  34. if SYMREVNAME ~= "" then
  35.    if datatype(left(SYMREVNAME,1)) ~= CHAR then do
  36.       say "*** ERROR: Unfortunately, RCS only accepts symbolic names"
  37.       say "           that start with a letter, so" SYMREVNAME
  38.       say "           is not acceptable."
  39.       exit
  40.    end
  41.  
  42. date=date()
  43.  /* Check whether we have an RCS subdirectory, so we can have */
  44.  /* the right prefix for our paths. */
  45.  /* SNEVL NOTE: This doesn't work if RCS is a file instead of */
  46.  /* a directory. The 'exists()' doesn't know the difference   */
  47. if exists("RCS") then
  48.    RCSDIR = "RCS/"
  49. else
  50.    RCSDIR = ""
  51.  
  52. /* Version number stuff, log message file */
  53. VERSIONFILE=RCSDIR || "rcsfreeze.ver"
  54. LOGFILE=RCSDIR || "rcsfreeze.log"
  55.  
  56. /* Initialize, rcsfreeze never run before in the current directory */
  57. if ~exists(VERSIONFILE) then do
  58.    check = open('ver',VERSIONFILE,'w')
  59.    if check ~= 1 then exit
  60.    check = writeln('ver','0')
  61.    check = close('ver')
  62. end
  63.  
  64. check = open('ver',VERSIONFILE,'r')
  65. if ~check then exit
  66. VERSIONNUMBER = readln('ver')
  67. check = close('ver')
  68.  
  69. /* Symbolic Revision Number */
  70. SYMREV="C_" || VERSIONNUMBER
  71. /* Allow the user to give a meaningful symbolic name to the revision. */
  72. if SYMREVNAME = "" then 
  73.    SYMREVNAME = SYMREV
  74.    
  75. say "rcsfreeze: Assign a symbolic name/number to entire RCS baseline"
  76. say ""
  77. say "    symbolic revision number computed: " SYMREV
  78. say "    symbolic revision number used:     " SYMREVNAME
  79. say ""
  80. say "these two differ only when rcsfreeze invoked with argument"
  81. say ""
  82. options prompt "OK to use these? (Y/N)"
  83. parse upper pull ans
  84. ans = left(ans,1)
  85. if ans ~= 'Y' then do
  86.    say "Re-issue the rcsfreeze command, giving the symbolic name"
  87.    say "you want to use as the argument to rcsfreeze."
  88.    exit
  89. end
  90.  
  91. say "give log message, summarizing changes (end with single '.')"
  92.  
  93. check = open('ver',VERSIONFILE,'w')
  94. VERSIONNUMBER = VERSIONNUMBER + 1
  95. check = writeln('ver',VERSIONNUMBER)
  96. check = close('ver')
  97.  
  98. /* Stamp the logfile. Because we order the logfile the most recent */
  99. /* first we will have to save everything right now in a temporary file. */
  100. TMPLOG="t:rcsfrz" || address()
  101.  
  102. check = open('tmp',TMPLOG,'w')
  103.  
  104. /* Now ask for a log message, continously add to the log file */
  105. outline = "Version:" SYMREVNAME "(" || SYMREV || "), Date:" DATE
  106. check = writeln('tmp',outline)
  107. check = writeln('tmp',"-------------")
  108. options prompt ">"
  109. do forever
  110.   parse pull inline
  111.   if inline = "." then break
  112.   check = writeln('tmp',inline)
  113. end
  114.  
  115. check = writeln('tmp',"-------------")
  116.  
  117. if exists(LOGFILE) then do
  118.    check = open('log',LOGFILE,"r")
  119.  
  120.    do until EOF('log')
  121.       line = readln('log')
  122.       check = writeln('tmp',line)
  123.    end
  124.    check = close('log')
  125. end
  126.  
  127. check = close('tmp')
  128.  
  129. 'copy' TMPLOG LOGFILE
  130.  
  131. 'delete' TMPLOG
  132.  
  133. /* Now the real work begins by assigning a symbolic revision number */
  134. /* to each rcs file. Take the most recent version of the main trunk. */
  135.  
  136. status=0
  137.  
  138. files = showdir(RCSDIR,'f',' ')
  139. rlogfile = "ram:rlog." || address()
  140. say "Checking for locked files..."
  141. do i=1 to words(files)
  142.    file = word(files,i)
  143.    if right(file,2) = ",v" then do
  144.       'rlog -h' file '>' rlogfile
  145.       check = open('header',rlogfile,'r')
  146.       do while ~eof('header')
  147.         line = readln('header')
  148.         /* get the revision number of the most recent revision */
  149.      if left(line,5) = 'head:' then do
  150.            rev.i = word(line,2)
  151.      end 
  152.      if word(line,1) = 'locks:' then do
  153.            /* make sure no files are checked out */
  154.            locker = word(readln('header'),1)
  155.            if locker ~= "access" then do
  156.               say "rcsfreeze: **** file" file "is locked by" locker
  157.               say "rcsfreeze: **** NO FREEZE DONE ****"
  158.               exit 10
  159.         end
  160.            break;
  161.      end 
  162.       end
  163.       check = close('header')
  164.    end
  165. end
  166. say "No files checked out."
  167. say ""
  168. say "Freezing baseline under symbolic name:" SYMREVNAME
  169. do i=1 to words(files)
  170.    file = word(files,i)
  171.    if right(file,2) = ",v" then do
  172.       say "   freezing" file "(" || rev.i || ")"
  173.       'rcs -q -n' || SYMREVNAME || ':' || rev.i file
  174.       status = rc
  175.       if status then break
  176.    end
  177. end
  178. exit status
  179.